/*
 * 版权所有 (c) 2022-2099 TBIT。保留所有权利。
 */

/*
 * 版权所有 (c) 2022-2099 TBIT。保留所有权利。
 */

package com.tbit.main.util;

import com.tbit.main.pojo.Point;

import java.util.*;

/**
 * 随机生成经纬度
 *
 * @author <a href="mailto:li.yao@tbit.com.cn">yao</a>
 * @version 3.8.8
 * @since 2024/2/20 13:54
 * @see <a href="https://doc.weixin.qq.com/doc/w3_AVsAUwYrAAc5MFvVcZ6T02877xum1?scode=ACsAvwcxAA48kzY5QYAVsAUwYrAAc&version=4.1.20.6024&platform=win">需求</a>
 */
public class RandomPointUtil {

    /**
     * 生成某个点附近 n 米多个经纬度
     * @param lon 经度
     * @param lat 维度
     * @param meters 米
     * @param pointSize 经纬度数量
     * @return 经纬度信息
     */
    public static List<Point> getRandomPoint(Double lon, Double lat, Double meters, Integer pointSize) {
        List<Point> points = new ArrayList<>(pointSize);

        if (pointSize == 1) {
            Point curr = new Point(lon, lat);
            points.add(curr);
            return points;
        }

        // 用于存储已经生成过的经纬度点
        // 生成一个随机的经纬度点，2 米以内，且不能重复
        Set<String> containsP = new HashSet<>(pointSize);

        // n 米对应的经度差值和纬度差值
        double lonOffset = meters / 111320;
        double latOffset = meters / 110540;

        Random random = new Random();

        for (int i = 0; i < pointSize;) {
            Point point = new Point();
            // 生成一个随机的经度偏移量，范围是-0.5到0.5
            double lonDelta = random.nextDouble() - 0.5;
            // 生成一个随机的纬度偏移量，范围是-0.5到0.5
            double latDelta = random.nextDouble() - 0.5;
            // 计算新的经度和纬度
            point.setX(lon + lonDelta * lonOffset);
            point.setY(lat + latDelta * latOffset);

            // 如果已经存在，就重新生成
            String p = point.getX() + "," + point.getY();
            if (!containsP.contains(p)) {
                // 将新的经纬度点加入到集合中
                containsP.add(p);
                points.add(point);
                i++;
            }
        }

        return points;
    }

    public static void main(String[] args) {
        // 原始经纬度
        // 113.936,22.548
        List<Point> points = getRandomPoint(113.95, 22.55, 2.0, 10);
        System.out.println("数量：" + points.size());
        // 测试生成10个随机的经纬度点
        for (Point point : points) {
            System.out.println("经度：" + point.getX() + "，纬度：" + point.getY());
        }
    }
}